//
// Created by wujehy on 2020/6/13.
//

#include <iostream>
#include <KeyPairData.h>
#include <ConsultCipther.h>
#include <Common.h>
using namespace GeeJoan::Common;
int main()
{
    // 两组密钥 需要预先生成
    KeyPairData keyPairData1 , keyPairData2;
    keyPairData1.generateKeyPair();
    keyPairData2.generateKeyPair();
    ConsultCipther userA_private_server( keyPairData1) ,userDeviceA1( keyPairData2) ;

    // 两组公钥 , 可以开放出去,
    // 其中设备 A1 在烧录的时候烧入 私有服务器的密钥
    std::string deviceA1_public_key = keyPairData2.getMPublicKey();
    // 而 服务端可以在 注册设备的时候 将这个设备的公钥 获取.
    std::string user_server_publice_key = keyPairData1.getMPublicKey();
    // 在上面的基础条件中 , 双方没有暴露 自己的私钥 , 且操作是安全的
    // 上报数据 用户设备 使用 用户服务端 的 公钥 加密消息
    std::string report_data = "test"; // 需要上报的数据

    std::string report_cipther_bytes ; // 加密后的bytes流
    // 设备使用服务器的公钥加密原始数据中, 然后获取 加密后的流 report_cipther_bytes
    userDeviceA1.ConsultEnCipther( report_data , user_server_publice_key, report_cipther_bytes);

    // 输出 , encode 的是加密 的 字节流, 密文 无法解出
    std::cout << " input : " << report_data << std::endl;
    std::cout << "encode : " << StringToHex( report_cipther_bytes) << std::endl;

    // 服务器解包数据
    std::string server_decipther_out ;
    // 将密文 和 设备的公钥 解出 原文
    userA_private_server.ConsultDeCipther( report_cipther_bytes , deviceA1_public_key, server_decipther_out);
    //　得到正确结果
    std::cout << "decode : " << server_decipther_out << std::endl;

    //　在整个过程中　，只有指定的双方可以解出　消息　

    /**
     * 输出:
     *  input : test
     *  encode : 167517EE
     *  decode : test
     */
    return 0;
}